FusedBatchNorm ================= 对输入张量执行融合批归一化(Fused Batch Normalization),在多核间拆分批量单元并行完成归一化与仿射变换。 .. math:: \hat{x}_{b,c} = \frac{x_{b,c} - mean_c}{\sqrt{variance_c + \epsilon}}, \quad y_{b,c} = scale_c \cdot \hat{x}_{b,c} + offset_c 输入: - **input** - 输入张量首地址,形状为 ``[unit, channel]``。 - **scale** - 缩放系数数组首地址,长度为 ``channel``。 - **offset** - 平移系数数组首地址,长度为 ``channel``。 - **mean** - 归一化均值数组首地址,长度为 ``channel``。 - **variance** - 归一化方差数组首地址,长度为 ``channel``。 - **parameters** - 参数结构体首地址,布局如下: - ``parameters[0]``: epsilon,数值稳定项(float/float16) - ``parameters[1]``: channel,通道数(int) - ``parameters[2]``: unit,归一化单元数量(批量大小 × 高 × 宽)(int) - **core_mask(int, 可选)** - 核掩码(仅适用于共享存储版本)。 输出: - **output** - 融合批归一化计算结果的张量首地址。 支持平台: ``FT78NE`` ``MT7004`` .. note:: - FT78NE 支持 fp32 数据类型。 - MT7004 支持 fp16、fp32 数据类型。 **共享存储版本:** .. c:function:: void fp_fused_batch_norm_s(float *input, float *scale, float *offset, float *mean, float *variance, float *output, void *parameters, int core_mask) .. c:function:: void hp_fused_batch_norm_s(float16 *input, float16 *scale, float16 *offset, float16 *mean, float16 *variance, float16 *output, void *parameters, int core_mask) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 19-20 // MT7004 示例(共享存储多核,DDR 地址) #include int main(void) { float *input = (float *)0x81000000; float *scale = (float *)0x81020000; float *offset = (float *)0x81021000; float *mean = (float *)0x81022000; float *variance = (float *)0x81023000; float *output = (float *)0x81024000; void *parameters = (void *)0x81050000; *(float *)parameters = 1e-5f; // epsilon int *int_params = (int *)((char *)parameters + 4); int_params[0] = 64; // channel int_params[1] = 1024; // unit int core_mask = 0xff; fp_fused_batch_norm_s(input, scale, offset, mean, variance, output, parameters, core_mask); return 0; } **私有存储版本:** .. c:function:: void fp_fused_batch_norm_p(float *input, float *scale, float *offset, float *mean, float *variance, float *output, void *parameters) .. c:function:: void hp_fused_batch_norm_p(float16 *input, float16 *scale, float16 *offset, float16 *mean, float16 *variance, float16 *output, void *parameters) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 18-19 // MT7004 示例(私有存储单核,AM 地址) #include int main(void) { float16 *input = (float16 *)0x10000000; float16 *scale = (float16 *)0x10020000; float16 *offset = (float16 *)0x10021000; float16 *mean = (float16 *)0x10022000; float16 *variance = (float16 *)0x10023000; float16 *output = (float16 *)0x10024000; void *parameters = (void *)0x10050000; *(float16 *)parameters = float32_to_float16(1e-4f); // epsilon int *int_params = (int *)((char *)parameters + 4); int_params[0] = 32; // channel int_params[1] = 512; // unit hp_fused_batch_norm_p(input, scale, offset, mean, variance, output, parameters); return 0; }